home *** CD-ROM | disk | FTP | other *** search
- C Dili - 7. Konu
-
- KELIME KATARI (STRING) NEDIR?
-
- Bir katar, genellikle harflerden olusan karakterler dizisidir. Ciktinizin
- guzel ve manali gorunmesi icin, icinde isimler ve adresler olabilmesi
- icin, programlarinizin katarlar kullanmasi sarttir. C dilinde tam tanimi,
- "char" tipi bilgilerin, NULL karakter (yani sifir) ile sonlandirilmasidir.
-
- C bir katari karsilastiracagi, kopyalayacagi yada ekrana yansitacagi
- zaman, bunlari gerceklestiren fonksiyonlar, NULL gorunene dek bu islemi
- yapmak uzere programlanmistir.
-
- ARRAY (dizi) NEDIR?
-
- dizi, ayni tip verilerin birbiri arkasina tanimlanmasidir. Kelime katari,
- bir cins dizidir.
-
- CHRSTRG.C:
- ================================================================
-
- main()
- {
- char isim[7]; /* Bir karakter dizisi tanimlayalim */
-
- isim[0] = 'T';
- isim[1] = 'u';
- isim[2] = 'r';
- isim[3] = 'g';
- isim[4] = 'u';
- isim[5] = 't';
- isim[6] = 0; /* Bos karakter - katarin sonu */
-
- printf("Isim %s dur. \n",isim);
- printf("Icinden bir karakter: %c\n",isim[2]);
- printf("Ismin bir parcasi: %s \n",&isim[3]);
- }
-
- ================================================================
-
- Bu programda, ilk once, "char" tipi bir tanimlama goruyoruz. Koseli
- parantezler icinde, kac hanelik bir dizi tanimlanacagini belirtiyoruz. C
- dilinde butun diziler sifirdan basladigi icin, bu tanimlama ile
- kullanabilecegimiz en yuksek index degeri 6 dir.
-
- KATAR NASIL KULLANILIR
-
- Demek ki, "isim" degiskeni, icinde 7 tane karakter tutabilir. Fakat en son
- karakterin sifir olmasi zorunlugu oldugu icin, kullanilabilecek olan alan
- 6 karakterliktir. Bu katarin icine manali birsey yuklemek icin, yedi tane
- komut veriyoruz - her biri, katara bir karakter atamaktadir. En sonunda
- da, katarin sonunu belirten sifir rakamini koyuyoruz. (Bir "#define" ile
- NULL karakteri, programin basinda sifir olarak tanimlayabiliriz.)
-
- printf komutundaki %s isareti, printf'e "isim" isimli katardan, sifira
- rastlayincaya kadar ekrana yazmasini belirtir. Dikkat etmeniz gereken bir
- nokta, "isim" degiskeninin indexinin yazilmasinin gerekmedigidir.
-
- KATARIN BIR KISMININ YAZILMASI
-
- Ikinci printf komutu ise %c ile, katarin icinden sadece bir karakter
- (harf) yazilmasini gosterir. Istedigimiz karakterin index numarasini da,
- "isim" degiskeninin yanina, koseli parantezler arasinda gosterebiliriz.
-
- Son printf komutunda ise, katarin 4. karakterinden itibaren yazmanin bir
- ornegidir. "isim" degiskeninin onundeki & (ampersand) isareti, isim[3]'un
- hafizada saklandigi adresin printf'e gecirilmesini belirtir. Adresleri 8.
- konuda gorecegiz, fakat ufak bir ornek ile size bizleri nelerin
- bekledigini gostermek istedim.
-
- BAZI KATAR FONKSIYONLARI
-
- KATAR.C
- ================================================================
-
- main()
- {
- char isim1[12],isim2[12],karisik[25];
- char baslik[20];
-
- strcpy(isim1,"Rosalinda");
- strcpy(isim2,"Zeke");
- strcpy(baslik,"Bu bir basliktir.");
-
- printf(" %s\n\n",baslik);
- printf("isim 1: %s \n",isim1);
- printf("isim 2: %s \n",isim2);
-
- if(strcmp(isim1,isim2)>0) /* sayet isim1 > isim2 ise, 1 dondurur */
- strcpy(karisik,isim1);
- else
- strcpy(karisik,isim2);
-
- printf("Alfabetik olarak en buyuk isim %s dir.\n",karisik);
-
- strcpy(karisik,isim1);
- strcat(karisik," ");
- strcat(karisik,isim2);
- printf("Iki isim birden %s\n",karisik);
- }
- ================================================================
- Ilk once 4 tane katar tanimliyoruz. Daha sonra, "strcpy" isimli cok pratik
- bir fonksiyona geliyoruz. Yaptigi is, bir katari, bir digerine, ta ki
- sifir bulunana kadar kopyalamak. Hangi katarin hangisine kopyalancagini
- hatirlamak icin, bir atama komutunu dusunun ("x=23" gibi). Veri,
- sagdakinden, soldakine kopyalanir. Bu komutun yapilmasindan sonra, isim1
- in icinde, "Rosalinda" olacaktir - den-densiz olarak. Den-denler,
- derleyicinin sizin bir katar tanimladiginizi anlamasi icin gereklidir.
-
- KATARLARIN ALFABETIK OLARAK SIRAYA KONMASI
-
- Ilginizi cekebilecek diger bir fonksiyonda, "strcmp" dur. Sayet kendisine
- gecirilen birinci katar ikinciden daha buyukse, 1 dondurur, ayni ise 0, ve
- ikinci daha buyukse -1 dondurur. "Zeke" katarinin kazanmasi, sizi herhalde
- sasirtmaz. Burada katarin boyu onemli degildir, sadece icindeki
- karakterler. Ayrica harflerin buyuk yada kucuk harf olmasi da fark
- ettirir. C de bir katarin butun harflerini kucuk yada buyuge ceviren
- fonksiyonlar da vardir. Bunlari daha ileri kullanacagiz.
-
- KATARLARI BIRBIRINE EKLEMEK
-
- En son satirda, "strcat" isimli yeni bir fonksiyon goreceksiniz. Gorevi,
- bir katarin sonuna diger katari eklemektir. Bunu yaparken NULL karakterin
- de yerli yerinde olmasini saglar. Burada, "isim1", "karisik" 'a
- kopyalanir, daha sonra "karisik" a iki bosluk ve "isim2" eklenir.
-
- Katarlar zor degildir, ve son derece faydalidirlar. Onlari kullanmayi
- iyice ogrenmenizde fayda vardir.
-
-
- BIR TAMSAYI DIZISI
-
- INTDIZIN.C:
- ================================================================
- main()
- {
- int degerler[12];
- int index;
-
- for (index = 0;index < 12;index++)
- degerler[index] = 2 * (index + 4);
-
- for (index = 0;index < 12;index++)
- printf("Index = %2d deki degeri %3d dir..\n",index,degerler[index]);
-
- }
- ================================================================
-
- Bu programda, bir tamsayi dizisi tanimliyoruz. Gordugunuz gibi, ayni katar
- tanimlama gibi.. Bu sayede, index degiskeni haric oniki tane degiskenimiz
- oluyor. Bu degiskenlerin isimleri "degerler[0]" , "degerler[1]" ,vs. dir.
- Ilk "for" dongusunde, bunlara deger atiyoruz, ikincisi ise, index
- degiskeni ve "degerler" dizisinin icindekileri ekrana yaziyor.
-
- BIR KAYAR NOKTA DIZINI
-
- BUYUKDIZ.C:
- ================================================================
- char isim1[] = "Birinci Program basligi";
-
- main()
- {
- int index;
- int ivir[12];
- float tuhaf[12];
- static char isim2[] = "Ikinci Program Basligi";
-
- for (index = 0;index < 12;index++) {
- ivir[index] = index + 10;
- tuhaf[index] = 12.0 * (index + 7);
- }
-
- printf("%s\n",isim1);
- printf("%s\n\n",isim2);
- for (index = 0;index < 12;index++)
- printf("%5d %5d %10.3f\n",index,ivir[index],tuhaf[index]);
- }
- ================================================================
-
- Burada, "float" olarak tanimli bir kayar nokta dizisi goruyorsunuz.
- Ayrica bu program, katarlara nasil baslangic degeri atanabilecegini
- gosteriyor. Koseli parantezlerin icini bos birakarak, derleyicinin o
- veriyi saklamak icin yeteri kadar yer ayarlamasini sagladik. Programin
- icinde, bir katar daha ilk degerini veriyoruz. Burada onune "static"
- koymak zorunlugumuz var. Baska yeni birsey yok bu programda. Degiskenler
- rastgele degerlere atanir, ve sonra da bu degerler ekrana yazdirilir.
-
-
- BIR FONKSIYONDAN DEGER DONDURME
-
- GERIDOND.C:
- ================================================================
- main()
- {
- int index;
- int matrix[20];
-
- for (index = 0;index < 20;index++) /* veriyi uretelim */
- matrix[index] = index + 1;
-
- for (index = 0;index < 5;index++) /* orjinal veriyi, ekrana. */
- printf("Baslangic matrix[%d] = %d\n",index,matrix[index]);
-
- yapbirsey(matrix); /* fonksiyona gidip, deger degistirme */
-
- for (index = 0;index < 5;index++) /* degismis matrix i yazalim */
- printf("Geri donen matrix[%d] = %d\n",index,matrix[index]);
- }
-
- yapbirsey(list) /* Veri donusunu gosterir */
- int list[];
- {
- int i;
-
- for (i = 0;i < 5;i++) /* print original matrix */
- printf("Onceki matrix[%d] = %d\n",i,list[i]);
-
- for (i = 0;i < 20;i++) /* add 10 to all values */
- list[i] += 10;
-
- for (i = 0;i < 5;i++) /* print modified matrix */
- printf("Sonraki matrix[%d] = %d\n",i,list[i]);
- }
- ================================================================
-
- Bir fonksiyondan deger dondurmenin bir yolu da, diziler kullanmaktir.
- Buradam 20 hanelik bir dizi tanimladiktan sonra, icine degerler atiyoruz,
- bu degerlerin ilk besini ekrana yazdiktan sonra, "yapbirsey" isimli
- fonksiyona atliyoruz. Burada goreceginiz gibi, bu fonksiyon "matrix"
- isimli diziye "list" demeyi tercih ediyor. Fonksiyona, ne cins bir dizi
- gececegini bildirmek icin, "int" olarak "list"i tanimliyoruz. Fonksiyona
- kac elemanlik bir dizi gecegini soylememize luzum yok, fakat istenirse
- belirtilebilir. Bu nedenle bos koseli parantezler kullaniyoruz.
-
- Bu fonksiyon da, kendisine gecen degerleri gosterdikten sonra, bu
- degerlere 10 ekliyor, ve yeni degerleri gosterip, ana programa geri
- donuyor. Ana programda goruyoruz ki, fonksiyonun yaptigi degisiklikler,
- "matrix" degerlerini de degistirmis.
-
- Dizilerin, normal degiskenlerin aksine, fonksiyondaki degerleri degisince,
- cagiran programdaki dizinin degerlerinin degismesini garipsiyebilirsiniz.
- Pointerlar konusuna gelince butun bunlar daha manali olacaktir.
-
- BIRDEN FAZLA BOYUTLU DIZILER
-
- COKLUDIZ.C:
- ================================================================
- main()
- {
- int i,j;
- int buyuk[8][8],dev[25][12];
-
- for (i = 0;i < 8;i++)
- for (j = 0;j < 8;j++)
- buyuk[i][j] = i * j; /* Bu bir carpim tablosudur */
-
- for (i = 0;i < 25;i++)
- for (j = 0;j < 12;j++)
- dev[i][j] = i + j; /* Bu da bir toplama tablosudur */
-
- buyuk[2][6] = dev[24][10]*22;
- buyuk[2][2] = 5;
- buyuk[buyuk[2][2]][buyuk[2][2]] = 177; /* bu, buyuk[5][5] = 177; demek */
-
- for (i = 0;i < 8;i++) {
- for (j = 0;j < 8;j++)
- printf("%5d ",buyuk[i][j]);
- printf("\n"); /* Her i nin degeri artinca, bir RETURN */
- }
- }
- ================================================================
-
- Burada iki tane iki boyutlu dizi kullaniyoruz. "buyuk" adli 8 e 8 lik
- dizinin elemanlari [0][0] dan [7][7] ye kadar, toplam 64 tanedir. Diger
- tanimli "dev" dizi ise, kare degildir, fakat dizinin kare olmasinin sart
- olmadigini gosteren bir ornektir.
-
- Iki dizi de biri carpim tablosu, digeri de toplama tablosu ile doldurulur.
-
- Dizi elemanlarinin tek tek degistirilebilecegini gostermek icin, once
- "buyuk" un elemanlarinda birine, "dev" in bir elemani ile, 22 ile
- carpildiktan sonra atanir. Ikinci atamada ise, "buyuk[2][2]" elemani 5
- degerine atanir. Herhangi bir islemin index olarak kullanilabilecegini
- gosteren ucuncu atama ise, aslinda "big[5][5] = 177;" dir.
-
- ODEVLER
-
- 1. Herbiri yaklasik 6 karakter uzunlugunda uc kisa katarin icine "strcpy"
- ile iclerine "bir", "iki" ve "dort" kelimelerini kopyalayan bir program
- yazin. Daha sonra, bu katarlari, daha buyuk bir katarin icine, uc kelimeyi
- bir araya getirerek yerlestirin. Cikan sonucu on kere ekrana yazdirin.
-
- 2. Herbiri 10 elemanli olan "dizi1" ve "dizi2" isimli iki tamsayi dizisi
- tanimlayin, ve iclerine bir dongu ile, ivir zivir bilgi doldurun. Daha
- sonra her bir elemanini, ayni boydaki bir baska diziye ekleyin. Bu cikan
- sonucu da "diziler" isimli 3. bir diziye atayin. Sonuclari ekrana
- yazdirin:
-
- 1 2 + 10 = 12
- 2 4 + 20 = 34
- 3 6 + 30 = 36 gibi..
-
- Ipucu: printf komutu soyle gorunecek:
- printf("%4d %4d + %4d = %4d\n",index,dizi1[index],dizi2[index],
- diziler[index]);
-